package com.ronz.queue;
import java.util.Scanner;

/**
 * @Description 用数组模拟队列
 * @Author Ronz
 * @Date 2020/12/19 11:02
 * @Version 1.0
 */
public class No1_ArrayQueue {

    public static void main(String[] args) {
        ArrayQueue arrayQueue = new ArrayQueue(7);

        Scanner input = new Scanner(System.in);
        boolean flag = true;
        while(flag){
            showMenu();
            String line = input.nextLine();
            char key = line.charAt(0);          // 获取输入的第一个关键字
            switch (key){
                case 's':       // 显示队列
                    arrayQueue.showQueue();
                    break;
                case 'a':       // 入队列
                    System.out.print("请输入要入队列的数：");
                    String num = input.nextLine();
                    arrayQueue.addQueue(Integer.valueOf(num));
                    break;
                case 'q':       // 出队列
                    try{
                        int quit = arrayQueue.quitQueue();
                    }catch (RuntimeException e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':       // 退出程序
                    flag = false;
                    input.close();
                    System.out.println("退出程序！");
                    break;
            }

        }
    }

    public static void showMenu(){
        System.out.println("*************************");
        System.out.println("s(show)：显示队列");
        System.out.println("a(add)：添加数据到队列");
        System.out.println("q(quit)：从队列中取出数据");
        System.out.println("e(end)：退出程序");
        System.out.println("*************************");
        System.out.println("请输入您的选择：");
    }

}

/**
 * @Description 使用数组模拟队列的一个类
 */
class ArrayQueue{

    private int maxSize;    // 队列最大长度
    private int begin;      // 指向队头
    private int end;        // 指向队尾
    private int[] arr;      // 该数组用于模拟队列

    /**
     * @Description 队列初始化
     * @Param [maxSize]
     * @return
     */
    public ArrayQueue(int maxSize){
        this.maxSize = maxSize;
        this.arr = new int[maxSize];
        this.begin = -1;        // 开始时，队列中是没有数据的，所以模拟的数组为空，指针应当为 -1
        this.end = -1;
    }

    /**
     * @Description 使用数组模拟入队列
     * @Param [item]
     * @return void
     */
    public void addQueue(int item){
        // 需要先判断队尾在哪里，队尾一定要小于队列最大长度
        if (end < maxSize-1){
            end++;
            arr[end] = item;
            System.out.println("入队了+++++" + item);
        } else {
            // end == maxSize - 1 说明队尾指针指向了最后一个，队列满了
            System.out.println("队列已满，入队失败!");
        }
    }

    /**
     * @Description 使用数组模拟出队列
     * @Param []
     * @return int
     */
    public int quitQueue(){
        // 首先判断队列是否为空
        if (begin == end){          // 如果队头等于队尾指针，说明为空
            throw new RuntimeException("队列为空，出队失败！");
        }
        // 队头小于队尾，说明队列正常，准备出队
        begin++;                    // 队头指向的是队伍第一个人的前一个位置，队尾指向的是队伍的最后一个人的位置
        System.out.println("出队了-----：" + arr[begin]);
        return arr[begin];
    }

    /**
     * @Description 打印队列数据
     * @Param []
     * @return void
     */
    public void showQueue(){
        if (begin == end){
            System.out.println("队列为空！");
        }else{
            System.out.print("[ ");
            for (int i=begin+1; i<end; i++){
                System.out.print(arr[i] + ", ");
            }
            System.out.print(arr[end]);
            System.out.print(" ]");
            System.out.println();
        }
    }


}